
package com.tedu.api.list;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**包位置：java.util
 * Queue   Deque  队列
 * 作用：实现数据的有序存储，用于数据缓冲、多线程协调线程使用
 * Collection 顶级集合下子集：Queue集合接口
 * 实现类：LinkedList
 */
public class QueueAPI {
    @Test
    public void testQueue(){
        //创建队列--自己使用功能
        Queue<String> queue=new LinkedList<>();
        /**
         * offer(E e)     返回值：boolean---add一样
         * 作用：入队操作---队尾追加元素
         */
        queue.offer("凤凰传奇");
        queue.offer("任贤齐");
        queue.offer("周杰伦");
        queue.offer("那英");
        System.out.println("队列："+queue);
        /**
         * poll()  返回值：E
         * 作用：出队操作，获取队首元素，并且将元素从队列元素中删除
         */
        String str=queue.poll();
        str=queue.poll();
        System.out.println("队列出队:"+str);
        System.out.println("队列："+queue);
        /**
         * peek()  返回值：E
         * 作用：出队操作，获取队首元素，不删除队列元素
         */
        str=queue.peek();//周杰伦
        System.out.println("队列出队：【peek】"+str);
        System.out.println("队列："+queue);
    }
    /**
     * 需求：队列--【历史名人】---遍历队列  while   队列中历史名人
     *                         [遍历之后元素清空]
     *                         遍历队列  增强for 队列中历史名人
     *                         [遍历之后元素存在]
     */
    @Test
    public void testHistory(){
        Queue<String> q=new LinkedList<>();
        q.offer("秦始皇");  q.offer("王安石");
        q.offer("柳宗元");  q.offer("汉武帝");
        //遍历 1：while   队列中历史名人[遍历之后元素清空]
        while (q.size()>0){
            q.poll();//出队首，删除队首
        }
        System.out.println("队列："+q);
        //遍历 2：增强for  队列中历史名人[遍历之后元素存在]
        for(String str:q){//增强for String str 普通for in i=;i...;i++/i--
            q.peek();
            System.out.println("队列："+q);
        }
    }
    /**
     *双端队列  Deque接口继承Queue 接口
     * 作用：入队和出队操作--保存数据，可以在二端插入和删除元素
     * Deque接口中的方法：与Queue一致，扩展几个方法
     *
     * 栈结构【业务：撤销操作】
     */
    @Test
    public void testDeque(){
        Deque<String> d=new LinkedList<>();
        d.offer("香蕉");d.offer("苹果");
        d.offer("葡萄");d.offer("橘子");
        System.out.println("Deque队列："+d);
        //双端增加：addFirst() 给队首添加元素  addLast()给队尾添加元素
        d.addFirst("西瓜");  d.addLast("草莓");
        System.out.println("双端队列："+d);
        //双端删除：poll peek(队列删除就这俩)
        d.pollFirst(); //pollFirst()出列队首，队列中队首删除
        System.out.println("删除队首："+d);
        d.peekFirst();//d.peekFirst();删除队首，保留队列
        System.out.println("不删除队首："+d);
        //获取队列元素---队首、队尾---getFirst\getLast   get获取
        System.out.println("队列【队首】："+d.getFirst());
        System.out.println("队列【队尾】："+d.getLast());

    }
    /**
     * Deque接口中的方法：与Queue一致，拓展几个方法
     *  push():压栈--功能:offer一致
     *  pop():出栈---功能：pollLast一致
     *  压栈:先进后出
     */
    @Test
    public void testStack(){
        Deque<String> stack=new LinkedList<>();//创建队列
        stack.push("精卫");
        stack.push("后裔");
        stack.push("夸父");
        System.out.println("栈结构："+stack);
        String str=stack.pop();//出栈pop  获取首元素
        System.out.println("栈结构【出栈】:"+str);
        System.out.println("双端队列："+stack);
        //队列中：pop poll peek方法使用特点！
        //答：pop方法针对栈结构：
        // 特点：针对双端队列最后添加元素【对首】获取队首元素
        //poll和peek是队列结构：
        //特点：针对队列追加元素【对首】，poll获取对首元素并删除
        //                           peek获取对首元素并保存
    }

}
